#include "list.h"

// 单链表头节点构建         已检验
UserNode *userHeadNode()
{
    UserNode *head = malloc(sizeof(UserNode));
    if (head == 0)
    {
        return NULL;
    }
    head->next = NULL;
    return head;
}
// 单链表尾部插入           已检验
void addUserNode(UserNode *head, UserData *data)
{
    UserNode *p = head;
    UserNode *node = malloc(sizeof(UserNode));
    node->data = *data;
    node->next = NULL;
    while (p->next)
    {
        p = p->next;
    }
    p->next = node;
    head->len++;
}
// 单链表销毁               已检验
void removeUserList(UserNode *head)
{
    UserNode *p = head->next;
    if (!p)
    {
        return;
    }
    UserNode *temp = NULL;
    while (p)
    {
        temp = p;
        free(temp);
        p = p->next;
    }
}
// 双向循环链表头节点构建     已检验
FlightNode *flightHeadNode()
{
    FlightNode *head = malloc(sizeof(FlightNode));
    if (NULL == head)
    {
        printf("头节点创建失败！\n");
        return NULL;
    }
    head->prev = head;
    head->next = head;
    head->len = 0;
    return head;
}
// 双向循环链表尾插          已检验
void addFlightNode(FlightNode *head, FlightData *data)
{
    if (!head)
    {
        printf("表不存在！\n");
        return;
    }

    // 创建新节点
    FlightNode *p = malloc(sizeof(FlightNode));
    if (NULL == p)
    {
        printf("节点创建失败！\n");
        return;
    }
    p->data = *data;
    p->next = p;
    p->prev = p;

    FlightNode *h = head;
    // 定位到插入位置的前一个节点
    for (int i = 0; i < head->len; i++)
    {
        h = h->next;
    }
    // 如果链表为空，直接插入作为唯一节点
    if (head->len == 0)
    { 
        head->next = p;
        head->prev = p;
        p->next = head;
        p->prev = head;
        head->len = 1;
        return;
    }
    // 非空情况下节点插入
    p->next = h->next;
    p->prev = h;
    h->next->prev = p;
    h->next = p;
    head->len++;
}
// 双向循环链表任意位置删除         已检验
void removeFlight(FlightNode *head, int index)
{
    // 检查索引是否越界
    if (index < 0 || index >= head->len)
    {
        printf("索引越界\n");
        return;
    }
    // 检查链表是否存在
    if (!head)
    {
        printf("表不存在\n");
    }
    // 检查链表是否已空
    if (head->next == head)
    {
        printf("表已空\n");
        return;
    }
    // 遍历至目标节点的前一个节点
    FlightNode *h = head; 
    for (int i = 0; i < index; i++)
    {
        h = h->next;
    }
    // 定义一个指针n1指向要移除的节点
    FlightNode *n1 = h->next;
    // 移除头节点的情况
    if (index == 0)
    {
        h->next = n1->next;        // 更新头节点的指向
        n1->next->prev = n1->prev; // 更新后继节点的前向指针
        free(n1);                  // 释放要移除的节点内存
        head->len--;               // 更新链表长度
        return;
    }

    // 移除非头节点的情况
    h->next = n1->next; // 更新前一个节点的指向
    n1->next->prev = h; // 更新后继节点的前向指针
    free(n1);           // 释放要移除的节点内存
    head->len--;        // 更新链表长度
}
// 销毁双向循环链表                     已检验
void removeFlightList(FlightNode *head)
{
    if (!head)
    {
        printf("链表不存在");
        return;
    }
    FlightNode *p = head->next;
    if (p == head)
    {
        printf("信息为空");
        return;
    }

    FlightNode *temp = NULL;
    while (p != head)
    {
        temp = p;
        p = p->next;
        free(temp);
    }
}